package com.wasion.gydpe.common.util;

/**
 * 
 * @ClassName: PnFn
 * @Description: 根据单元点和单元类的标示码，获取十六进制值
 *               <p>
 *               例如：A电压曲线的Fn=F89，调用getFn(89)，即得到010b
 *               </p>
 * @author 高意
 * @date Aug 28, 2012 2:51:27 PM
 * 
 */
public class PnFn {

	/**
	 * 根据信息点标示的下标获取信息点的DA值，即通常所说的信息点标识pn（n=1～2040）
	 * 
	 * @param n为数据单元标示中信息点标示的下标
	 * @return 信息点DA
	 */
	public static String getPn(int n) {

		// 获取信息点组DA2的十进制值
		int da2 = (int) Math.ceil(n / 8.0);

		// 信息点元DA1定义
		int da1 = 0;

		// 信息点元中1在的位置
		int loc = n % 8 == 0 ? 8 : n % 8;

		// 拼接成DA1，为逆向的
		String strDa1Template = "00000000";
		strDa1Template = strDa1Template.substring(0, loc - 1) + "1"
				+ strDa1Template.substring(loc, strDa1Template.length());

		// 获取信息点元DA1的十进制值
		for (int i = 0; i < 8; i++) {
			int temp = Integer.parseInt(strDa1Template.substring(i, i + 1));
			da1 += (int) Math.pow(2, i) * temp;
		}

		// 转换成十六进制数
		String strDa1 = Integer.toHexString(da1);
		String strDa2 = Integer.toHexString(da2);

		strDa1 = strDa1.length() == 1 ? "0" + strDa1 : strDa1;
		strDa2 = strDa2.length() == 1 ? "0" + strDa2 : strDa2;

		return strDa1 + strDa2;
	}

	/**
	 * 根据信息类标示的下标获取信息点的DT值，即通常所说的信息类标识fn（n=1～248）
	 * 
	 * @param n为数据单元标示中信息点标示的下标
	 * @return 信息类DT
	 */
	public static String getFn(int n) {

		// 获取信息点组DA2的十进制值
		int dt2 = (int) Math.ceil(n / 8.0) - 1;

		// 信息点元DA1定义
		int dt1 = 0;

		// 信息点元中1在的位置
		int loc = n % 8 == 0 ? 8 : n % 8;

		// 拼接成DA1，为逆向的
		String strDt1Template = "00000000";
		strDt1Template = strDt1Template.substring(0, loc - 1) + "1"
				+ strDt1Template.substring(loc, strDt1Template.length());

		// 获取信息点元DA1的十进制值
		for (int i = 0; i < 8; i++) {
			int temp = Integer.parseInt(strDt1Template.substring(i, i + 1));
			dt1 += (int) Math.pow(2, i) * temp;
		}

		// 转换成十六进制数
		String strDt1 = Integer.toHexString(dt1);
		String strDt2 = Integer.toHexString(dt2);

		strDt1 = strDt1.length() == 1 ? "0" + strDt1 : strDt1;
		strDt2 = strDt2.length() == 1 ? "0" + strDt2 : strDt2;

		return strDt1 + strDt2;
	}

}
